#pragma once

#include "viml/value.h"
#include <vector>
#include <string>

namespace viml {

// ========================================
// 文件读写操作
// ========================================

/**
 * file_read(path) - 读取整个文件内容
 * @param path String - 文件路径
 * @return String - 文件内容
 * @throws runtime_error - 文件不存在或无权限
 */
Value file_read_builtin(const std::vector<Value>& args);

/**
 * file_write(path, content) - 写入文件
 * @param path String - 文件路径
 * @param content String - 写入内容
 * @return Boolean - 成功标志
 * @throws runtime_error - 写入失败
 */
Value file_write_builtin(const std::vector<Value>& args);

/**
 * file_append(path, content) - 追加内容到文件
 * @param path String - 文件路径
 * @param content String - 追加内容
 * @return Boolean - 成功标志
 * @throws runtime_error - 追加失败
 */
Value file_append_builtin(const std::vector<Value>& args);

/**
 * file_readlines(path) - 按行读取文件
 * @param path String - 文件路径
 * @return List - 行列表
 * @throws runtime_error - 文件不存在
 */
Value file_readlines_builtin(const std::vector<Value>& args);

/**
 * file_writelines(path, lines) - 按行写入文件
 * @param path String - 文件路径
 * @param lines List - 行列表
 * @return Boolean - 成功标志
 * @throws runtime_error - 写入失败
 */
Value file_writelines_builtin(const std::vector<Value>& args);

// ========================================
// 文件属性查询
// ========================================

/**
 * file_exists(path) - 判断文件是否存在
 * @param path String - 文件路径
 * @return Boolean - 存在标志
 */
Value file_exists_builtin(const std::vector<Value>& args);

/**
 * file_isfile(path) - 判断是否为普通文件
 * @param path String - 文件路径
 * @return Boolean - 是否为文件
 */
Value file_isfile_builtin(const std::vector<Value>& args);

/**
 * file_isdir(path) - 判断是否为目录
 * @param path String - 文件路径
 * @return Boolean - 是否为目录
 */
Value file_isdir_builtin(const std::vector<Value>& args);

/**
 * file_size(path) - 获取文件大小
 * @param path String - 文件路径
 * @return Number - 文件大小（字节）
 * @throws runtime_error - 文件不存在
 */
Value file_size_builtin(const std::vector<Value>& args);

/**
 * file_mtime(path) - 获取文件修改时间
 * @param path String - 文件路径
 * @return Number - 修改时间戳
 * @throws runtime_error - 文件不存在
 */
Value file_mtime_builtin(const std::vector<Value>& args);

// ========================================
// 目录操作
// ========================================

/**
 * dir_create(path) - 创建目录
 * @param path String - 目录路径
 * @return Boolean - 成功标志
 * @throws runtime_error - 创建失败
 */
Value dir_create_builtin(const std::vector<Value>& args);

/**
 * dir_remove(path) - 删除空目录
 * @param path String - 目录路径
 * @return Boolean - 成功标志
 * @throws runtime_error - 删除失败
 */
Value dir_remove_builtin(const std::vector<Value>& args);

/**
 * dir_list(path) - 列出目录内容
 * @param path String - 目录路径
 * @return List - 文件名列表
 * @throws runtime_error - 目录不存在
 */
Value dir_list_builtin(const std::vector<Value>& args);

/**
 * dir_walk(path) - 递归遍历目录树
 * @param path String - 目录路径
 * @return List - 文件路径列表
 * @throws runtime_error - 目录不存在
 */
Value dir_walk_builtin(const std::vector<Value>& args);

// ========================================
// 文件操作工具
// ========================================

/**
 * file_copy(src, dst) - 复制文件
 * @param src String - 源路径
 * @param dst String - 目标路径
 * @return Boolean - 成功标志
 * @throws runtime_error - 复制失败
 */
Value file_copy_builtin(const std::vector<Value>& args);

/**
 * file_move(src, dst) - 移动文件
 * @param src String - 源路径
 * @param dst String - 目标路径
 * @return Boolean - 成功标志
 * @throws runtime_error - 移动失败
 */
Value file_move_builtin(const std::vector<Value>& args);

/**
 * file_delete(path) - 删除文件
 * @param path String - 文件路径
 * @return Boolean - 成功标志
 * @throws runtime_error - 删除失败
 */
Value file_delete_builtin(const std::vector<Value>& args);

} // namespace viml
